/******************************************************************
 Copyright (C) 2019 - All Rights Reserved by
 文 件 名 : rollsubtitleswidget.cpp --- RollSubtitlesWidget
 作 者    : 倪Niyh 华
 编写日期 : 2019
 说 明    :
 历史纪录 :
 <作者>    <日期>        <版本>        <内容>
  Niyh	   2019    1.0.0.0 1     文件创建
*******************************************************************/
#include "rollsubtitleswidget.h"
#include <QPainter>

RollSubtitlesWidget::RollSubtitlesWidget(QWidget *parent) :
    QWidget(parent),
    m_nXoffset(0),m_nDirection(LEFT_DIRECTION)
{
    m_strTextColor = "#ffffff";
    m_nFontPixsize = 14;

    m_timer = new QTimer(this);
    m_timer->setInterval(30);
    connect(m_timer, SIGNAL(timeout()), this, SLOT(slot_timerout()));
}

RollSubtitlesWidget::~RollSubtitlesWidget()
{
    if (m_timer->isActive()) m_timer->stop();
}

/**
 * @brief RollSubtitlesWidget::setTextColor
 * 设置字幕颜色
 * @param color eg:#ffffff
 */
void RollSubtitlesWidget::setTextColor(const QString &color)
{
    QColor clr(color);
    if (!clr.isValid()) return;

    m_strTextColor = color;
    this->update();
}

/**
 * @brief RollSubtitlesWidget::ClearText
 * 清除文字
 */
void RollSubtitlesWidget::clearText()
{
    m_strText.clear();
    this->update();
}

/**
 * @brief RollSubtitlesWidget::SetText
 * @param text      需要显示的字幕
 * @param direction 设置文字滚动方向
 */
void RollSubtitlesWidget::setText(const QString &text, int direction)
{
    if (text.isEmpty()) return;

    m_strText = text;
    m_nDirection = direction;
    // 如果当前文字小于文本框宽度，不启动滚动显示
    QFont font = this->font();
    font.setPixelSize(m_nFontPixsize);
    int nWidth = QFontMetrics(font).horizontalAdvance(text);
    if (nWidth > this->width())
    {
        if (m_timer->isActive())
        {
            m_timer->stop();
        }
        // 启动定时器
        m_timer->start();
    }
    m_nXoffset = 0;
    // 刷新显示
    this->update();
}

/**
 * @brief RollSubtitlesWidget::GetText
 */
QString RollSubtitlesWidget::getText() const
{
    return m_strText;
}

/**
 * @brief RollSubtitlesWidget::SltTimerOut
 * 处理位移
 */
void RollSubtitlesWidget::slot_timerout()
{
    QFont font = this->font();
    font.setPixelSize(m_nFontPixsize);
    int nTextWidth = QFontMetrics(font).horizontalAdvance(m_strText);

    if (LEFT_DIRECTION == m_nDirection)
    {
        m_nXoffset--;
        // 如果已经把最后一个文字都显示完了，从最右边再走过来
        if (m_nXoffset < -nTextWidth)
        {
            m_nXoffset = this->width();
        }
    }

    // 刷新显示
    this->update();
}

void RollSubtitlesWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.fillRect(this->rect(), Qt::transparent);

    // 开始绘制文字
    QFont font = painter.font();
    font.setPixelSize(m_nFontPixsize);
    painter.setFont(font);
    painter.setPen(m_strTextColor);
    int nTextWidth = QFontMetrics(font).horizontalAdvance(m_strText);
    painter.drawText(m_nXoffset, 0, nTextWidth, this->height(), Qt::AlignLeft | Qt::AlignVCenter, m_strText);
}
